NoSQL数据库
1.1 各种NoSQL数据库的优势
| 需求特征 | 推荐 NoSQL 类型 |
|---|---|
| 极高速度、简单读写 | 键值存储 (Redis) |
| 快速迭代、数据结构多变 | 文档数据库 (MongoDB) |
| 海量数据写入、高可用 | 列族数据库 (Cassandra/HBase) |
| 深度关联关系、路径追踪 | 图数据库 (Neo4j) |
| 复杂关键词检索、统计分析 | 搜索引擎 (Elasticsearch) |
1.2 成熟系统中(如典型的电商或社交平台)各个数据库搭配使用情况
1. 核心存储层:关系型数据库 (MySQL / PostgreSQL)
这是系统的“真理来源”(Source of Truth)。
- 存储内容: 用户账号、订单记录、财务支付、权限配置等。
- 为什么用: * ACID 事务: 保证钱和订单不能出错。
- 复杂查询: 支持多表 Join 和严谨的逻辑关系。
- 搭配策略: 读写分离。主库负责写,多个从库(Read Replicas)负责读,分担压力。
2. 高速缓存层:键值存储 (Redis)
位于应用层和数据库之间,是系统的“加速器”。
- 存储内容: 热点商品信息、用户 Session、验证码、全局配置、排行榜。
- 为什么用: 内存操作,读写延迟在微秒级。
- 搭配策略: Cache-Aside 模式。
- 程序先查 Redis。
- Redis 没有,再查 MySQL。
- 查完回写 Redis,并设置过期时间(TTL)。
3. 搜索与分析层:搜索引擎 (Elasticsearch)
当 MySQL 的 LIKE %keyword% 慢到无法接受时,它就上场了。
- 存储内容: 商品全文索引、日志数据(ELK 栈)、复杂的组合筛选条件。
- 为什么用: 倒排索引技术,支持毫秒级的关键词模糊匹配和多维度聚合。
- 搭配策略: 数据同步。通过 Canal 监听 MySQL 的 Binlog 或在 Service 层异步写入,将需要搜索的数据同步到 ES。
4. 扩展存储层:文档数据库 (MongoDB)
处理“不规则”或“频繁变动”的数据。
- 存储内容: 商品详情描述(参数多变)、用户动态/朋友圈、站内信、评论。
- 为什么用: 无需预定义表结构(Schema-free),开发效率极高,扩容方便。
- 搭配策略: 作为 MySQL 的补充,存储那些不需要强关联、但结构复杂的数据。
5. 大数据/指标层:列族存储 (HBase / Cassandra) 或 时序数据库 (InfluxDB)
处理“海量写入”和“时间线”数据。
- 存储内容: 用户行为埋点、传感器数据、快递物流轨迹。
- 为什么用: 针对写操作极大优化,能承受每秒万级甚至十万级的写入。
一个完整的请求链路示例
想象你在某 App 搜索并购买一件衣服:
- 搜索: 请求进入系统,首先由 Elasticsearch 提供模糊匹配,给出商品列表。
- 详情: 你点击进入详情页,系统从 Redis 获取缓存好的商品详情;如果没缓存,去 MongoDB 读取非结构化的规格参数。
- 下单: 你点击购买,系统在 MySQL 中开启事务:扣减库存、生成订单、扣除余额(此时必须保证强一致性)。
- 足迹: 你的浏览行为被异步写入 HBase 或 ClickHouse,用于后续的大数据推荐分析。